# -*- coding: utf-8 -*-
# @name             : 定时任务
# @author           : OneYoung
# @create           : 2024/07/18
# @version          : v1.0
# @desc             : 执行定时任务，并通过接口返回任务列表

import time
from datetime import datetime
import uvicorn
from fastapi import FastAPI
from utils.scheduler import Scheduler
from contextlib import asynccontextmanager

# 定时任务调度器
scheduler = Scheduler()


# 待测任务
def test_task(name=None):
    print(f"定时任务执行测试-{name}：", time.strftime("%Y-%m-%d %H:%M:%S"))


# 启动定时任务
def start_task():
    # 立即执行
    scheduler.run_job_immediately(
        func=test_task,
        args=['立即执行']
    )
    # 定时日期
    scheduler.add_date_job(
        func=test_task,
        run_date=datetime.now().replace(minute=datetime.now().minute + 1),
        args=['定时日期执行']
    )
    # Cron任务
    scheduler.add_cron_job(
        func=test_task,
        cron_expr={"second": "30"},
        args=['Cron执行']
    )
    # 间隔时间
    scheduler.add_interval_job(
        func=test_task,
        interval={"seconds": 10},
        args=['间隔时间执行']
    )


# 程序运行启动调度器，退出关闭调度器
@asynccontextmanager
async def lifespan(p: FastAPI):
    start_task()
    print(f"{p.title}启动定时任务成功...")
    yield
    scheduler.shutdown()
    print(f"{p.title}关闭定时任务成功...")


# 添加接口，用于查看定时任务列表
app = FastAPI(lifespan=lifespan)


@app.get("/jobs", summary="获取定时任务列表")
async def get_job_list():
    return [scheduler.get_job_info(job.id) for job in scheduler.scheduler.get_jobs()]


if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8001)
